#include "App_PowerCtrl.h"

float last_displacement = 0.0f;
// 长度
float displacement = 0.0f;
// 圈数
int32_t circle = 0;
// 不足一圈的部分
float displacement_part = 0.0f;

// 进入停机模式函数
static void EnterStopMode(void)
{
    debug_printfln("Enter Stop Mode........");
    // 使能PWR时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

    // 清除WUF标志
    PWR_ClearFlag(PWR_FLAG_WU);

    // 进入停机模式，使用WFI指令
    PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

    // 系统唤醒后会从这里继续执行
    // 此时需要重新配置系统时钟
    SystemInit();
    App_PoweerrCtrl_Wakeup();
}
void App_PowerCtrl_Init(void)
{
    Dri_Uart_Init();
    Int_MT6816_Init();
    Int_24C256_Storage_Init();
}

void App_PowerCtrl_EnterStop(void)
{
    debug_printfln("displacement=%.2f", displacement);
    // 保存当前位移值
    last_displacement = displacement;
    debug_printfln("save: last_displacement = %.2f", last_displacement);

    Int_MT6816_EnterStopMode();
    // 进入停机模式
    EnterStopMode();
}

void App_PoweerrCtrl_Wakeup(void)
{
    // 检查是否从编码器唤醒并退出STOP模式配置
    if (Int_MT6816_IsWakeupFromStop())
    {
        Int_MT6816_ExitStopMode();
        Int_MT6816_ClearWakeupFlag();
    }
}

void App_PowerCtrl_Run(void)
{
    GetDisplacementInfo(&displacement, &circle, &displacement_part, 0);
}
